Abstract
En el presente notebook se encuentra el trabajo realizado en base a los archivos que provienen de la aplicación de trading *Metratader 5* esto con la intención de realizar un profundo análisis que nos lleve al detalle financiero que nos ofrece el haber realizado inversiones específicas en cierto periodo de tiempo. De esta manera podremos analizar los cambios que presentaron nuestras finanzas en el periodo y asimismo se puede observar los sesgos cognitivos que como inversionista se pueden llegar a tener. Esto último se analiza en la tercera parte del laboratorio que lleva por nombre **Behavioral Finance** siendo una de las áreas más significativas de este laboratorio.
En este laboratorio se muestra un análisis importante en base a una serie de inversiones creadas con la aplicación Metatrader 5 que es una es una plataforma de comercio electrónico ampliamente utilizada por los comerciantes especulativos de divisas minoristas en línea.
El software consta de un componente de cliente y de servidor. El componente del servidor lo ejecuta el corredor y el software del cliente se proporciona a los clientes del corredor, que lo utilizan para ver los precios y gráficos de transmisión en vivo, para realizar pedidos y para administrar sus cuentas.
Con esta interfaz, el usuario hace una serie de inversiones y el objetivo del laboratorio es poder leer dicho reporte propio de la plataforma para posteriormente crear tablas de estadística descriptiva que modelen la información que se presenta de una manera más simple y digerible para el usuario a lo largo del periodo en el que se estuvo interviniendo en las inversiones.
Posteriormente se presentan las Medidas de Atribución al Desempeño que estarán marcadas por el Radio de Sharpe, Drawdown y Drawup mismos que se definirán más adelante.
En la tercera parte encontraremos el llamado Behavioral Finance que muestra los cálculos sobre la presencia y cuantificación del sesgo cognitivo "Disposition Effect".
Como cuarta y última parte se mostrarán las visualizaciones de las partes anteriores que nos ayuden a ver de una manera más práctica la información que sea necesaria.
Terminando con una serie de conclusiones acerca de lo que el laboratorio trató.
Para pode correr el presente notebook, será necesario haber instalado o ya tener el archivo requirements.txt que presenta lo siguiente:
Las dependencias necesarias para poder correr el notebook son:
from functions import *
from visualizations import *
# Por si existe algún warning
import warnings
warnings.simplefilter("ignore")
En este apartado se mostrará una serie de funciones para preparar el procesamiento de los datos, así como una tabla de cálculos genéricos y una tabla de ranking.
La finalidad de ello es poder hacer la lectura de los datos que nos proporciona el Metatrader 5 para poder analizar de una manera asertiva lo subsecuente. Una vez que esto se realiza, se muestran las estadísticas básicas y el ranking de las operaciones realizadas en base del total de las mismas.
Dentro de lo que se muestra más relevante, tenemos:
Esta lectura de datos se hace primero por medio de Mt5 y es lo que se observa a continuación:
mt5, df_deals, df_orders = f_initialize("C:\Program Files\FxPro_MetaTrader5\\terminal64.exe",5400340,"B31gdeC6","FxPro-MT5")
mt5
Cuenta inicializada = AccountInfo(login=5400340, trade_mode=0, leverage=100, limit_orders=70, margin_so_mode=0, trade_allowed=True, trade_expert=True, margin_mode=0, currency_digits=2, fifo_close=False, balance=100033.15, credit=0.0, profit=0.0, equity=100033.15, margin=0.0, margin_free=100033.15, margin_level=0.0, margin_so_call=60.0, margin_so_so=50.0, margin_initial=0.0, margin_maintenance=0.0, assets=0.0, liabilities=0.0, commission_blocked=0.0, name='Ale Barr', server='FxPro-MT5', currency='USD', ...)
<module 'MetaTrader5' from 'C:\\Users\\Cesar\\anaconda3\\lib\\site-packages\\MetaTrader5\\__init__.py'>
df_deals.head()
| time | ticket | symbol | type | volume | price | order | commission | swap | profit | comment | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2021-09-14 16:48:13 | 32716862 | 2 | 0.00 | 0.00000 | 0 | 0.0 | 0.0 | 100000.00 | User with ID b9376cae-ee02-473e | |
| 1 | 2021-09-17 15:54:14 | 32774056 | EURUSD | 0 | 0.01 | 1.17764 | 45386434 | 0.0 | 0.0 | 0.00 | |
| 2 | 2021-09-20 23:43:50 | 32812591 | AUDUSD | 0 | 0.05 | 0.72547 | 45428531 | 0.0 | 0.0 | 0.00 | |
| 3 | 2021-09-20 23:48:06 | 32812604 | GOLD | 0 | 0.10 | 1765.55000 | 45428545 | 0.0 | 0.0 | 0.00 | |
| 4 | 2021-09-21 15:21:14 | 32823575 | EURUSD | 1 | 0.01 | 1.17388 | 45441181 | 0.0 | -0.2 | -3.76 |
df_orders.head()
| time_setup | time_done | ticket | symbol | type | volume_initial | price_open | sl | tp | state | comment | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2021-09-17 15:54:14 | 2021-09-17 15:54:14 | 45386434 | EURUSD | 0 | 0.01 | 0.0 | 0.0 | 0.0 | 4 | |
| 1 | 2021-09-20 23:43:50 | 2021-09-20 23:43:50 | 45428531 | AUDUSD | 0 | 0.05 | 0.0 | 0.0 | 0.0 | 4 | |
| 2 | 2021-09-20 23:48:06 | 2021-09-20 23:48:06 | 45428545 | GOLD | 0 | 0.10 | 0.0 | 0.0 | 0.0 | 4 | |
| 3 | 2021-09-21 15:21:14 | 2021-09-21 15:21:14 | 45441181 | EURUSD | 1 | 0.01 | 0.0 | 0.0 | 0.0 | 4 | |
| 4 | 2021-09-21 20:34:32 | 2021-09-21 20:34:32 | 45452225 | AUDUSD | 1 | 0.05 | 0.0 | 0.0 | 0.0 | 4 |
En esta ocasión se procede a realizar la lectura de datos por medio del archivo reporte que se descarga de mt5 pero que se obtiene en formato .xlxs (Excel)
positions, orders, deals = f_leer_archivo("C:/Users/Cesar/PycharmProjects/MyST_Lab3_LABV/ReportHistory_Alejandra.xlsx")
positions
| Position | Symbol | Type | Volume | Price | S / L | T / P | Time.1 | Price.1 | Commission | Swap | Profit | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Time | ||||||||||||
| 2021.09.17 15:54:14 | 45386434 | EURUSD | buy | 0.01 | 1.17764 | NaN | NaN | 2021.09.21 15:21:14 | 1.17388 | 0 | -0.2 | -3.76 |
| 2021.09.20 23:43:50 | 45428531 | AUDUSD | buy | 0.05 | 0.72547 | NaN | NaN | 2021.09.21 20:34:32 | 0.72331 | 0 | -0.15 | -10.8 |
| 2021.09.20 23:48:06 | 45428545 | GOLD | buy | 0.1 | 1765.55 | 1745 | 1790 | 2021.09.23 23:23:44 | 1744.94 | 0 | -0.81 | -206.1 |
| 2021.09.21 20:53:38 | 45452543 | NDAQ.O | buy | 0.15 | 191.57 | 189 | 193 | 2021.09.22 17:00:28 | 193.03 | 0 | 0 | 0.22 |
| 2021.09.21 21:08:32 | 45452811 | UBER.N | buy | 5.2 | 44.42385 | 38.17 | 46.66 | 2021.09.24 16:42:38 | 44.47 | 0 | 0 | 0.23 |
| 2021.09.21 22:52:03 | 45454399 | HES.N | buy | 0.9 | 67.69 | 61.94 | 72.4 | 2021.09.23 16:56:22 | 72.4 | 0 | -0.01 | 4.24 |
| 2021.09.22 21:51:06 | 45478879 | HWM.N | sell | 5 | 30.96 | 31.26 | 30.65 | 2021.09.22 22:11:55 | 31.27 | 0 | 0 | -1.55 |
| 2021.09.22 22:26:11 | 45480406 | HOG.N | sell | 10 | 37.89 | 37.98 | 37.63 | 2021.09.23 16:31:05 | 38.31 | 0 | -0.03 | -4.2 |
| 2021.09.23 19:09:19 | 45502435 | NVAX.O | buy | 0.1 | 259.57 | NaN | NaN | 2021.09.24 16:48:39 | 248.1 | 0 | 0 | -1.15 |
| 2021.09.23 19:30:54 | 45502921 | #US100_Z21 | buy | 0.1 | 15306.5 | NaN | NaN | 2021.09.23 19:31:32 | 15301.25 | 0 | 0 | -10.5 |
| 2021.09.23 20:09:37 | 45503460 | TMUS.O | sell | 0.05 | 130.6 | 131.63 | 127.72 | 2021.09.24 16:45:53 | 130.42 | 0 | 0 | 0.01 |
| 2021.09.23 20:52:17 | 45503945 | MRNA.O | buy | 0.05 | 457.1 | 452.53 | 461.67 | 2021.09.24 16:31:05 | 447.08 | 0 | 0 | -0.5 |
| 2021.09.23 22:13:27 | 45504743 | SILVER | sell | 0.1 | 22.591 | NaN | NaN | 2021.09.24 15:05:02 | 22.554 | 0 | -0.29 | 18.5 |
| 2021.09.23 23:29:46 | 45505715 | GOLD | sell | 5 | 1741.52 | NaN | NaN | 2021.09.23 23:34:51 | 1741.02 | 0 | 0 | 250 |
orders.head()
| Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | |
|---|---|---|---|---|---|---|---|---|---|---|
| Open Time | ||||||||||
| 2021.09.17 15:54:14 | 45386434 | EURUSD | buy | 0.01 / 0.01 | market | NaN | NaN | 2021.09.17 15:54:14 | filled | NaN |
| 2021.09.20 23:43:50 | 45428531 | AUDUSD | buy | 0.05 / 0.05 | market | NaN | NaN | 2021.09.20 23:43:50 | filled | NaN |
| 2021.09.20 23:48:06 | 45428545 | GOLD | buy | 0.1 / 0.1 | market | NaN | NaN | 2021.09.20 23:48:06 | filled | NaN |
| 2021.09.21 15:21:14 | 45441181 | EURUSD | sell | 0.01 / 0.01 | market | NaN | NaN | 2021.09.21 15:21:14 | filled | NaN |
| 2021.09.21 20:34:32 | 45452225 | AUDUSD | sell | 0.05 / 0.05 | market | NaN | NaN | 2021.09.21 20:34:32 | filled | NaN |
deals.head()
| Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Time | ||||||||||||
| 2021.09.14 16:48:13 | 32716862 | NaN | balance | NaN | NaN | NaN | NaN | 0 | 0 | 100000 | 100000 | User with ID b9376cae-ee02-473e |
| 2021.09.17 15:54:14 | 32774056 | EURUSD | buy | in | 0.01 | 1.17764 | 45386434 | 0 | 0 | 0 | 100000 | NaN |
| 2021.09.20 23:43:50 | 32812591 | AUDUSD | buy | in | 0.05 | 0.72547 | 45428531 | 0 | 0 | 0 | 100000 | NaN |
| 2021.09.20 23:48:06 | 32812604 | GOLD | buy | in | 0.1 | 1765.55 | 45428545 | 0 | 0 | 0 | 100000 | NaN |
| 2021.09.21 15:21:14 | 32823575 | EURUSD | sell | out | 0.01 | 1.17388 | 45441181 | 0 | -0.2 | -3.76 | 99996.04 | NaN |
Vemos como se descargan los datos en ambos casos, tanto con el reporte como con mt5 tomando los datos necesarios que serán de utilidad para lo posterior.
Para verificar el funcionamiento de la función se realiza una prueba con "CADJPY" mismo que se encuentra en la plataforma de Mt5. No se hizo con un activo propio del reporte obtenido porque se quería verificar la conexión con Metatrader5.
f_pip_size("CADJPY")
100.0
Observamos que se obtiene un número entero, de acuerdo al instrumento ingresado como multiplicador de pips.
Se añade una columna de transformaciones en los tiempos. A lo que recibimos una columna llamada "Get_time" que incluye los segundos correspondientes en la que cada operación se encontró abierta.
f_columnas_tiempos(positions)
| Get_time | |
|---|---|
| Time | |
| 2021.09.17 15:54:14 | 343620.0 |
| 2021.09.20 23:43:50 | 75042.0 |
| 2021.09.20 23:48:06 | 257738.0 |
| 2021.09.21 20:53:38 | 72410.0 |
| 2021.09.21 21:08:32 | 243246.0 |
| 2021.09.21 22:52:03 | 151459.0 |
| 2021.09.22 21:51:06 | 1249.0 |
| 2021.09.22 22:26:11 | 65094.0 |
| 2021.09.23 19:09:19 | 77960.0 |
| 2021.09.23 19:30:54 | 38.0 |
| 2021.09.23 20:09:37 | 74176.0 |
| 2021.09.23 20:52:17 | 70728.0 |
| 2021.09.23 22:13:27 | 60695.0 |
| 2021.09.23 23:29:46 | 305.0 |
Se crea la columna de pips, que es donde se encuentra la cantidad de pips resultantes por cada operación incluyendo su símbolo. Por ende observaremos las columnas de los pips, los pips acumulados y el profit acumulado de cada operación realizada.
f_columnas_pips(positions)
| Position | Symbol | Type | Volume | Price | S / L | T / P | Time.1 | Price.1 | Commission | Swap | Profit | Time | Time_1 | Time_2 | Get_time | Pips | Pips_acm | Profit_acm | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Time | |||||||||||||||||||
| 2021.09.17 15:54:14 | 45386434 | EURUSD | buy | 0.01 | 1.17764 | NaN | NaN | 2021.09.21 15:21:14 | 1.17388 | 0 | -0.2 | -3.76 | 2021.09.17 15:54:14 | 2021-09-17 15:54:14 | 2021-09-21 15:21:14 | 343620.0 | -37.6000 | -37.6000 | -3.76 |
| 2021.09.20 23:43:50 | 45428531 | AUDUSD | buy | 0.05 | 0.72547 | NaN | NaN | 2021.09.21 20:34:32 | 0.72331 | 0 | -0.15 | -10.8 | 2021.09.20 23:43:50 | 2021-09-20 23:43:50 | 2021-09-21 20:34:32 | 75042.0 | -21.6000 | -59.2000 | -14.56 |
| 2021.09.20 23:48:06 | 45428545 | GOLD | buy | 0.1 | 1765.55 | 1745 | 1790 | 2021.09.23 23:23:44 | 1744.94 | 0 | -0.81 | -206.1 | 2021.09.20 23:48:06 | 2021-09-20 23:48:06 | 2021-09-23 23:23:44 | 257738.0 | -206.1000 | -265.3000 | -220.66 |
| 2021.09.21 20:53:38 | 45452543 | NDAQ.O | buy | 0.15 | 191.57 | 189 | 193 | 2021.09.22 17:00:28 | 193.03 | 0 | 0 | 0.22 | 2021.09.21 20:53:38 | 2021-09-21 20:53:38 | 2021-09-22 17:00:28 | 72410.0 | 14.6000 | -250.7000 | -220.44 |
| 2021.09.21 21:08:32 | 45452811 | UBER.N | buy | 5.2 | 44.42385 | 38.17 | 46.66 | 2021.09.24 16:42:38 | 44.47 | 0 | 0 | 0.23 | 2021.09.21 21:08:32 | 2021-09-21 21:08:32 | 2021-09-24 16:42:38 | 243246.0 | 0.4615 | -250.2385 | -220.21 |
| 2021.09.21 22:52:03 | 45454399 | HES.N | buy | 0.9 | 67.69 | 61.94 | 72.4 | 2021.09.23 16:56:22 | 72.4 | 0 | -0.01 | 4.24 | 2021.09.21 22:52:03 | 2021-09-21 22:52:03 | 2021-09-23 16:56:22 | 151459.0 | 47.1000 | -203.1385 | -215.97 |
| 2021.09.22 21:51:06 | 45478879 | HWM.N | sell | 5 | 30.96 | 31.26 | 30.65 | 2021.09.22 22:11:55 | 31.27 | 0 | 0 | -1.55 | 2021.09.22 21:51:06 | 2021-09-22 21:51:06 | 2021-09-22 22:11:55 | 1249.0 | -3.1000 | -206.2385 | -217.52 |
| 2021.09.22 22:26:11 | 45480406 | HOG.N | sell | 10 | 37.89 | 37.98 | 37.63 | 2021.09.23 16:31:05 | 38.31 | 0 | -0.03 | -4.2 | 2021.09.22 22:26:11 | 2021-09-22 22:26:11 | 2021-09-23 16:31:05 | 65094.0 | -4.2000 | -210.4385 | -221.72 |
| 2021.09.23 19:09:19 | 45502435 | NVAX.O | buy | 0.1 | 259.57 | NaN | NaN | 2021.09.24 16:48:39 | 248.1 | 0 | 0 | -1.15 | 2021.09.23 19:09:19 | 2021-09-23 19:09:19 | 2021-09-24 16:48:39 | 77960.0 | -114.7000 | -325.1385 | -222.87 |
| 2021.09.23 19:30:54 | 45502921 | #US100_Z21 | buy | 0.1 | 15306.5 | NaN | NaN | 2021.09.23 19:31:32 | 15301.25 | 0 | 0 | -10.5 | 2021.09.23 19:30:54 | 2021-09-23 19:30:54 | 2021-09-23 19:31:32 | 38.0 | -2.1000 | -327.2385 | -233.37 |
| 2021.09.23 20:09:37 | 45503460 | TMUS.O | sell | 0.05 | 130.6 | 131.63 | 127.72 | 2021.09.24 16:45:53 | 130.42 | 0 | 0 | 0.01 | 2021.09.23 20:09:37 | 2021-09-23 20:09:37 | 2021-09-24 16:45:53 | 74176.0 | 1.8000 | -325.4385 | -233.36 |
| 2021.09.23 20:52:17 | 45503945 | MRNA.O | buy | 0.05 | 457.1 | 452.53 | 461.67 | 2021.09.24 16:31:05 | 447.08 | 0 | 0 | -0.5 | 2021.09.23 20:52:17 | 2021-09-23 20:52:17 | 2021-09-24 16:31:05 | 70728.0 | -100.2000 | -425.6385 | -233.86 |
| 2021.09.23 22:13:27 | 45504743 | SILVER | sell | 0.1 | 22.591 | NaN | NaN | 2021.09.24 15:05:02 | 22.554 | 0 | -0.29 | 18.5 | 2021.09.23 22:13:27 | 2021-09-23 22:13:27 | 2021-09-24 15:05:02 | 60695.0 | 3.7000 | -421.9385 | -215.36 |
| 2021.09.23 23:29:46 | 45505715 | GOLD | sell | 5 | 1741.52 | NaN | NaN | 2021.09.23 23:34:51 | 1741.02 | 0 | 0 | 250 | 2021.09.23 23:29:46 | 2021-09-23 23:29:46 | 2021-09-23 23:34:51 | 305.0 | 5.0000 | -416.9385 | 34.64 |
En las últimas tres columnas se observa lo realizado en esta parte del laboratorio, donde se nos muestran los puntos porcentuales que corresponden a cada operación.
En esta parte se realiza el cálculo de las estadísticas básicas y el ranking por instrumento utilizado. Por ende se manda a llamar cada una de las tablas que se necesitan analizar por separado.
df_1_tabla
f_estadisticas_ba(positions)['df_1_tabla']
| Valor | |
|---|---|
| Ops totales | 14.000000 |
| Ganadoras | 6.000000 |
| Ganadoras_c | 3.000000 |
| Ganadoras_v | 3.000000 |
| Perdedoras | 8.000000 |
| Perdedoras_c | 6.000000 |
| Perdedoras_v | 2.000000 |
| Mediana_profit | -0.825000 |
| Mediana_pips | -2.600000 |
| r_efectividad | 0.428571 |
| r_proporcion | 0.750000 |
| r_efectividad_c | 0.214286 |
| r_efectividad_v | 0.214286 |
Se presenta el dataframe con la información solicitada y algomuy curioso que sucedió es que si nos fijamos en el indicador "r_efectividad_c" y "r_efectividad_v" vemos como los valores son los mismos y esto es puesto que tenemos 3 operaciones de venta que resultaron con un profit positivo y 3 operaciones de compra bajo el mismo escenario. Me parece curioso puesto que es el mismo valor pero tiene total sentido. Así nos damos cuenta que a veces tenemos decisiones al invertir que resultan casi de la misma manera aunque no sea lo que esperamos.
df_2_ranking
f_estadisticas_ba(positions)['df_2_ranking']
| Symbol | Rank% | |
|---|---|---|
| 0 | EURUSD | 0.0 |
| 1 | AUDUSD | 0.0 |
| 2 | GOLD | 50.0 |
| 3 | NDAQ.O | 100.0 |
| 4 | UBER.N | 100.0 |
| 5 | HES.N | 100.0 |
| 6 | HWM.N | 0.0 |
| 7 | HOG.N | 0.0 |
| 8 | NVAX.O | 0.0 |
| 9 | #US100_Z21 | 0.0 |
| 10 | TMUS.O | 100.0 |
| 11 | MRNA.O | 0.0 |
| 12 | SILVER | 100.0 |
| 13 | GOLD | 50.0 |
En este caso observemos que el ratio de efectividad se encuentra muy parejo o es 0 o es 50 o es 100, no existen muchas variantes para mi caso. Asimismo podemos notar como GOLD tuvo un ratio de efectividad de 50 al inicio y otro 50 al final que fue la operación que realice para contrarrestar las pérdidas que estaba teniendo. Entonces si lo vemos en conjunto, este activo tuvo un 100 al final, sumando ambos valores.
Ls valores de Rank% son muy parejos por decirlo de alguna manera pero no es que este mal el resultado, esto es debido a que de cada operación según el activo las mismas se cerraron con ganancia entonces los ranks resultan como 100%.
En este apartado se mostrará un DataFrame que incluye diversos valores, mismos que darán pauta del modo en que se invirtió el capital que se tenía en un inicio y con ello cuáles fueron los cambios presentados.
La primera de ellas, es la tabla que proviene de la función f_evolucion_capital a esta función se le ingresa el histórico de posiciones y su salida contiene tres columnas.
1. "Timestamp": Contiene las fechas día a día durante el priodo se hizo trading, exceptuando los sábados.
2. "Profit_d": Profit por día de todos los contenidos en el periodo que se hizo trading en ocasiones puede ser 0 o en ocasiones la suma de todos los profits al tener más de una operación.
3. "Profit_acm_d": Profit acumulado diario de tu cuenta de capital. Se encuentra expresado en capital ($), y contiene el valor inicial de la cuenta por lo que se podría decir que es el valor total del portafolio según la fecha que se indique.
La segunda de las tablas proviene de la función f_estadisticas_mad misma que contiene los siguientes datos.
1. "Sharpe": Mide el rendimiento promedio excedente sobre la tasa libre de riesgo por unidad de riesgo incurrido. Es decir, es un indicativo del rendimiento esperado del trader por encima de la tasa libre de riesgo descontando el riesgo en el que incurre. Mientras sea mas alto el valor del ratio, significa que el numerador fue muy grande o que el denominador fue muy pequeño. Esto, en terminos financieros, podría interpretarse que un Sharpe es alto cuando se tiene un rendimiento excedente despues de la tasa libre de riesgo alto, y/o, que la volatilidad de los rendimientos de la estrategia de trading fue baja.
2. "Drawdown / Drawup": La minusvalía/plusvalía máxima que se presentó en la evolución del capital. Esta medida puede ser calculada, tanto para información temporalmente medida en los mismos intervalos o equidistante (ej. rendimientos diarios) y también para información obtenida en intervalos distintos o no equidistante (ej: rendimiento por operación). Esto es posible ya que lo que se busca obtener de información es la fecha inicial, la fecha final y la magnitud del periodo donde la acumulación de pérdida/ganancia de capital resultó ser la mayor dentro del periodo de tiempo analizado.
Estas dos tablas nos ayudarán a presentar algunos índices financieros que nos marquen la pauta de que tan mala o que tan buena fue la operación que se realizó, así como el visualizar el rendimiento que tuvo el portafolio creado por el usuario.
En este apartado encontraremos la evolución del capital en el periodo en que se iniciaron las operaciones hasta el final cuando se cerró la última. Se hace uso de una compresión de lista para poder pasar las fechas a formato str y poder así incluirlas en el DataFrame final que muestra la función referente al tema.
# Pasar la fecha a formato str Y,m,d (fuera de la función porque solo se convierte una vez y
# la función se manda llamar posteriormente)
positions['Time_1'] = [i.strftime('%Y-%m-%d') for i in positions['Time_1']]
f_evolucion_capital(positions)
| timestamp | profit_d | profit_acm_d | |
|---|---|---|---|
| 0 | 2021-09-17 | -3.76 | 99996.24 |
| 1 | 2021-09-20 | -216.90 | 99779.34 |
| 2 | 2021-09-21 | 4.69 | 99784.03 |
| 3 | 2021-09-22 | -5.75 | 99778.28 |
| 4 | 2021-09-23 | 256.36 | 100034.64 |
Observamos como el periodo está comprendido del 17 de septiembre hasta el 23 de septiembre del año en curso. Asimismo se tiene un profit diario de los valores que se muestran en la columna profit_d y se observa como el 20 de septiembre fue el día con mayor pérdida y el 23 de septiembre el día con mayor ganancia. Por lo cual nuestro profit acumulado va en relación de las ganancias diarias presentadas.
Se procede a obtener las estadísticas MAD (Medidas de Atribución al Desempeño), mostrando de manera resumida lo explicado en el inicio de este apartado. Con una breve descripción del significado de cada valor mostrado.
f_estadisticas_mad(positions)
[*********************100%***********************] 1 of 1 completed
| Métrica | Valor | Descripción | ||
|---|---|---|---|---|
| 0 | sharpe_original | Cantidad | -29.724758 | Sharpe Ratio Fórmula Original |
| 1 | sharpe_actualizado | Cantidad | inf | Sharpe Ratio Fórmula Ajustada |
| 2 | drawdown_capi | Fecha Inicial | 2021.09.20 23:48:06 | Fecha inicial del DrawDown de Capital |
| 3 | drawdown_capi | Fecha Final | 2021-09-23 23:23:44 | Fecha final del DrawDown de Capital |
| 4 | drawdown_capi | DrawDown $ (capital) | -206.1 | Máxima pérdida flotante registrada |
| 5 | drawup_capi | Fecha Inicial | 2021.09.23 23:29:46 | Fecha inicial del DrawUp de Capital |
| 6 | drawup_capi | Fecha Final | 2021-09-23 23:34:51 | Fecha final del DrawUp de Capital |
| 7 | drawup_capi | DrawUp $ (capital) | 250 | Máxima ganancia flotante registrada |
De este modo se obtiene el DataFrame final con cada métrica. Cabe destacar que para mi caso, el sharpe actualizado se obtiene como inf puesto que se presentó una división entre 0 a la hora de sacar la desviación estándar de la resta de los rendimientos del portafolio creado y los rendimientos del índice. De modo que, podemos interpretar que la relación entre el S&P500 y nuestra inversión, no resultó ni mejor ni peor. Fue simplemente igualada a 0.
Asimismo obtenemos la máxima pérdida y la máxima ganancia flotante en el periodo de inversión.
Iniciaremos este apartado introduciendo lo que es el Behavioral Finance (traducido habitualmente al castellano como “Finanzas del comportamiento” o “Finanzas conductuales”, aunque quizás “Psicología de los inversores” o “Psicología del comportamiento financiero” podrían recoger mejor el sentido de la expresión) es una corriente relativamente nueva dentro de la economía financiera que estudia cómo afecta la psicología a la toma de decisiones financieras.
Los individuos actúan en los mercados de forma irracional, y el behavioral finance trata de entender esta irracionalidad, y ser capaces de parametrizar este comportamiento.
Con esto en mente, analizaremos el sesgo cognitivo propuesto por los autores Kahneman y Tversky, para el caso de trading, aplica como el efecto que se puede observar en el histórico de un trader sobre el hecho que tiende a cortar las ganancias rápido y mantener las pérdidas mucho tiempo, es decir, a materializar las ganancias más frecuentemente que las pérdidas.
Así el primer paso es analizar las operaciones ancla que son aquellas operaciones con un profit positivo o bien, las podemos llamar como "operaciones ganadoras". A continuación tenemos que realizar una función para identificar y cuantificar la presencia de un sesgo cognitivo durante el trading. Esto se realiza con el llamado "Disposition Effect" que es cuando una operación ancla se cerró y tenemos otras operaciones abiertas que presentan pérdida a las cuales llamaremos "perdedoras". Ya que tenemos esta relación entre las ganadoras y las perdedoras se valoran los posibles resultados de acuerdo al precio de entrada (Status-Quo) y revisamos si se comportan siguiendo una función de valuación con forma de S, cóncava para las ganancias (Aversión al riesgo) y convexa para las pérdidas (Propensión al riesgo).
De manera resumida se puede decir que se contabiliza...
Cuantas veces paso que:
Se cerró una operación ganadora y había otra perdedora abierta no cerrada en ese momento.
Para cada una de las anteriores se cuentan las veces que:
profit_perdedora/profit_acm < profit_ganadora/profit_acm
Para cada una de las anteriores se cuentan las veces que:
profit_perdedora/profit_ganadora es > 2.0
Si en el aumento o disminución del capital_acm, aumentaron las pérdidas o ganancias profit_ganadora & profit_perdedora contrastándolo con si el ratio profit_perdedora/profit_ganadora sigue siendo > 2.
Se obtiene una cierta cantidad de ocurrencias en las que se presentó el sesgo y con ello tenemos el tiempo en que sucedió correspondiente a cuando la operación ancla se cerró, puesto que es en este momento cuando permaneció abierta la operación perdedora relacionada y eso es de lo que nos habla el sesgo. En ocasiones se puede tener más de una operación perdedora relacionada a una ancla, sin embargo para este análisis se toma la operación perdedora con mayor pérdida. Para obtener lo mencionado anteriormente en relación a los profits es por medio de una comparación de los precios que tenían los activos al momento en que se incurre en el sesgo, y se hace la comparativa con su valor en pips correspondiente, puesto que como ya vimos los pips nos indican el cambio en puntos porcentuales respecto al precio. Entonces al dividir el profit de la perdedora entre los pips correspondientes al precio de cierre multiplicado por los nuevos pips del precio descargado reciente obtenemos el profit correspondiente a las operaciones perdedoras. De este modo, con los profits de las anclas y los proofits de las perdedoras que se obtienen podemos hacer las comparaciones y los conteos que nos arrojan el status quo, la aversión a la pérdida y la sensibilidad decreciente.
Una vez terminado lo anterior la función nos brinda un diccionario con el total de las ocurrencias y sus valores relacionados a la operación ganadora y a la perdedora con sus respectivos ratios.
El diccionario incluye:
'ocurrencias'
'cantidad': Cantidad de veces que ocurrió el sesgo, de acuerdo a la definición
'ocurrencia_1':
'timestamp': El timestamp del momento en el que se incurrió el sesgo
'operaciones':
'ganadora':
'instrumento': instrumento de la operación
'volumen': lotes de la operación
'sentido': 'sell' o 'buy'
'profit_ganadora': El valor del capital con el que se cerró la ganadora
'perdedora':
'instrumento': instrumento de la operación
'volumen': lotes de la operación
'sentido': 'sell' o 'buy'
'profit_perdedora': El valor del capital en pérdida flotante que tenia la perdedora
'ratio_cp_profit_acm': profit_perdedora/profit_acm del timestamp del momento en el que ocurrió el sesgo.
'ratio_cg_profit_acm': profit_ganadora/profit_acm del timestamp del momento en el que ocurrió el sesgo.
'ratio_cp_cg': el cálculo de profit_perdedora/profit_ganadora
'ocurrencia_2':
....
'resultados':
Asimismo se obtiene un DataFrame en resumen que incluye:
# Pasar la fecha a formato str Y,m,d, H,M,S (fuera de la función porque solo se convierte una vez y
# la función se manda llamar posteriormente)
positions['Time_2'] = [i.strftime("%Y/%m/%d, %H:%M:%S") for i in positions['Time_2']]
dic, status_quo, aversion_per, total_sen = f_be_de(positions)
dic
{'Ocurrencias': {'Cantidad': 6},
'Ocurrencia_1': {'Timestamp': [Timestamp('2021-09-22 17:00:28')],
'Operaciones': {'Ganadora': {'Instrumento': 'NDAQ.O',
'Volumen': '0.15',
'Sentido': 'buy',
'Profit_ganadora': 0.22},
'Perdedora': {'Instrumento': 'GOLD',
'Volumen': '0.1',
'Sentido': 'buy',
'Profit_perdedora': -248.70000000000013},
'Ratio_cp_profit_acm': {1.1281981491562336},
'Ratio_cg_profit_acm': {-0.000998003992015968},
'Ratio_cp_cg': {-1130.454545454546}}},
'Ocurrencia_2': {'Timestamp': [Timestamp('2021-09-24 16:42:38')],
'Operaciones': {'Ganadora': {'Instrumento': 'UBER.N',
'Volumen': '5.2',
'Sentido': 'buy',
'Profit_ganadora': 0.23},
'Perdedora': {'Instrumento': 'NVAX.O',
'Volumen': '0.1',
'Sentido': 'buy',
'Profit_perdedora': -0.24463818657367023},
'Ratio_cp_profit_acm': {0.0011109313227086427},
'Ratio_cg_profit_acm': {-0.0010444575632350937},
'Ratio_cp_cg': {-1.06364428945074}}},
'Ocurrencia_3': {'Timestamp': [Timestamp('2021-09-23 16:56:22')],
'Operaciones': {'Ganadora': {'Instrumento': 'HES.N',
'Volumen': '0.9',
'Sentido': 'buy',
'Profit_ganadora': 4.24},
'Perdedora': {'Instrumento': 'GOLD',
'Volumen': '0.1',
'Sentido': 'buy',
'Profit_perdedora': -248.70000000000013},
'Ratio_cp_profit_acm': {1.1515488262258653},
'Ratio_cg_profit_acm': {-0.01963235634578877},
'Ratio_cp_cg': {-58.655660377358515}}},
'Ocurrencia_4': {'Timestamp': [Timestamp('2021-09-24 16:45:53')],
'Operaciones': {'Ganadora': {'Instrumento': 'TMUS.O',
'Volumen': '0.05',
'Sentido': 'sell',
'Profit_ganadora': 0.01},
'Perdedora': {'Instrumento': 'NVAX.O',
'Volumen': '0.1',
'Sentido': 'buy',
'Profit_perdedora': -0.24463818657367023},
'Ratio_cp_profit_acm': {0.0010483295619372224},
'Ratio_cg_profit_acm': {-4.285224545766198e-05},
'Ratio_cp_cg': {-24.46381865736702}}},
'Ocurrencia_5': {'Timestamp': [Timestamp('2021-09-24 15:05:02')],
'Operaciones': {'Ganadora': {'Instrumento': 'SILVER',
'Volumen': '0.1',
'Sentido': 'sell',
'Profit_ganadora': 18.5},
'Perdedora': {'Instrumento': 'NVAX.O',
'Volumen': '0.1',
'Sentido': 'buy',
'Profit_perdedora': -0.24463818657367023},
'Ratio_cp_profit_acm': {0.0011359499748034463},
'Ratio_cg_profit_acm': {-0.08590267459138187},
'Ratio_cp_cg': {-0.01322368576073893}}},
'Ocurrencia_6': {'Timestamp': [Timestamp('2021-09-23 23:34:51')],
'Operaciones': {'Ganadora': {'Instrumento': 'GOLD',
'Volumen': '5',
'Sentido': 'sell',
'Profit_ganadora': 250},
'Perdedora': {'Instrumento': 'NVAX.O',
'Volumen': '0.1',
'Sentido': 'buy',
'Profit_perdedora': -0.24463818657367023},
'Ratio_cp_profit_acm': {-0.007062303307553993},
'Ratio_cg_profit_acm': {7.217090069284067},
'Ratio_cp_cg': {-0.000978552746294681}}},
'df': {'Dataframe': {'Ocurrencias': 6,
'Status_quo': '16.67%',
'Aversión_perdida': '0.0%',
'Sensibilidad_decreciente': 'Tiene sensibilidad decreciente'}}}
# Pasando a DataFrame lo final del dic con los resultados
bf = pd.DataFrame.from_dict(dic["df"], orient='index')
bf
| Ocurrencias | Status_quo | Aversión_perdida | Sensibilidad_decreciente | |
|---|---|---|---|---|
| Dataframe | 6 | 16.67% | 0.0% | Tiene sensibilidad decreciente |
Se observa como se incurrió en el sesgo 6 veces, que era el mismo número de anclas que se tenía entonces puedo decir que las inversiones realizadas presentan el sesgo en cada ocasión. Confirmando la teoría de que un trader tiende a cortar las ganancias rápido y mantener las pérdidas mucho tiempo. Que en realidad fue algo que yo hice cuando GOLD comenzó a bajar hasta que ya eran demasiadas pérdidas y decidí contrarrestar ese efecto vendiendo el activo en la última operación realizada.
Por último, se tiene un 16.67% de status_quo, una nula aversión a la pérdida y sí se tiene sensibilidad decreciente.
En este apartado se mostrarán tres gráficos correspondientes a ciertos resultados que provienen de estadística descriptiva, métricas de atribución al desempeño y behavioral finance. A manera de hacerlo más interactivo se realiza con la librería Plotly
graf_1(positions)
En este gráfico se muestra el porcentaje de ranking que observamos en la tabla llamada df_2_ranking vemos que en mi caso todo es muy equitativo porque como se explicó en el final de esa tabla casi todo se encuentra con valores de 0, 50 y 100 y el único activo que tiene 50 y 50 es GOLD que sumados hacen el 100%. En resumen, se muestra el ratio de efectividad de las operaciones realizadas con cada instrumento operado. Se reitera el hecho que del número de operaciones por instrumento se cerraron con ganancia.
graf_2(positions)
En este gráfico se muestra el capital acumulado diario representado por la línea negra en el intervalo de fechas en que se realizaron las operaciones que fue del 17/09/21 al 23/09/21.
En el caso de la línea roja se muestra la máxima pérdida flotante registrada desde la fecha inicial hasta la fecha final de ocurrencia de esta minusvalía siendo del 20/09/21 al 23/09/21 hecho que va en relación al mantenimiento de las pérdidas tal como se confirmó en el apartado de behavioral finance. De modo que este valor presenta una caída de -206.1 respecto al capital acumulado de ese momento.
Finalmente en la línea verde se muestra la máxima ganancia flotante registrada desde la fecha inicial hasta la fecha final de ocurrencia de esta plusvalía siendo en el mismo día del 23/09/21 que fue con la medida contrarrestadora que se realizó por parte del activo GOLD. Al ser en el mismo momento, nos elevó el capital acumulado del día en un +250 además de lo obtenido por parte de los otros activos operados.
graf_3(positions)
En este último gráfico se muestra la cantidad de veces que se observó cada principio del disposition effect. Es decir, es el conteo de las veces en que las ocurrencias presentaron o no presentaron status_quo, aversión a la pérdida y sensibilidad decreciente. Solo que este último hace el conteo de cada ocurrencia y no de la primera y la última como se hizo anteriormente en el apartado de behavioral finance.
De este modo, se obtiene una incidencia para status quo, una incidencia para sensibilidad decreciente y ninguna para la aversión a la pérdida.
Dentro de este laboratorio encontramos diversas formas de analizar lo que se realizó en el laboratorio anterior donde realizamos trading por medio de la plataforma mt5. La finalidad ahora era observar y cuantificar los sesgos que se presentan al invertir de tal o cual manera. Esto se hace por medio del behavioral finance, que como ya se explicó se trata de una corriente dentro de la economía financiera que busca estudiar la psicología respecto a nuestras decisiones financieras. Sin embargo, esto puede sonar un tanto imposible ¿cómo relacionas la psicología humana con las finanzas? pues bien, al final todo se basa en una decisión que pasa por la mente de un individuo, en este caso este individuo es un inversionista al cual por supuesto se le pueden analizar las decisiones financieras realizadas en cierto periodo de tiempo durante la inversión.
Cabe destacar que los personajes financieros toman decisiones basadas en algunos estereotipos denominados heurísticos y sesgos, que propician una rápida elección, sin evaluar a profundidad los sentimientos o emociones que afectan la decisión que se este tomando en ese preciso instante. Resulta de suma importania el estudio del behavioral finance, puesto que con ello, se culmina en una mayor comprensión de las decisiones financieras y se puede inferir la razón por la cual no se cumplen en su totalidad las teorías económicas clásicas, mismas que presentan como premisa principal el tener un inversionista total y enteramente racional. La idea final, es poder evitar en lo posible incurrir en errores económicos derivados de decisiones subjetivas que podrían resultar en escenarios mucho más complicados.
Si bien, en este caso trabajamos con dinero ficticio, algún día nos podremos tener frente a la situación de una verdadera inversión con grandes cantidades en juego por lo que resulta indispensable tener conocimiento sobre la influencia de las decisiones financieras en la mente de un inversionista. Aún cuando no podamos controlar todos los sesgos, es importante reconocer que existen y tratar de no caer en las redes porque al final nos encontramos ante un juego de azar que o resulta benéfico o resulta fatal para aquél que pone su dinero en él.
[1] Wikipedia "Metatrader 4" recuperado de https://en.wikipedia.org/wiki/MetaTrader_4 el día 18 de octubre de 2021.
[2] Fernández León Ángel (n.d) "BEHAVIORAL FINANCE: EL TRASFONDO CONDUCTISTA DE LAS FINANZAS" recuperado de http://acacia.org.mx/busqueda/pdf/09_02_Behavioral_Finance.pdf el día 24 de octubre de 2021.
[3] Villalobos Omar (n.d) "Módulo 3: Behavioral Finance" recuperado de clases de la materia Microestructuras y Sistemas de Trading.